/*
 * 使用方式，如不需要loading动画，post第三个参数设置为false
 */
// async fnName () {
//   let _this = this
//   let res = await _this.axios.post(_this.api.接口名称, { 'userName': '13055215093' })
//   // 终止脚本
//   if (!res) {
//     return
//   }
//   console.log(res)
// }

import axios from 'axios'
import qs from 'qs'
import {Loading,Message} from 'element-ui';

const errorMsg = '网络异常，请刷新重试'
const timeout = 10000 // 请求超时时间临界值
let loading = null

/*
 * 添加请求拦截器
 */
axios.interceptors.request.use(config => {
  if (config.loadState !== false) { // 判断是否需要loading动画
   loading = Loading.service({
      lock: true,
      text: '拼命加载中',
      spinner: 'el-icon-loading',
      background: 'rgba(0, 0, 0, 0.8)',
      customClass: 'loadingClass'
    });
  }
  // 在发送请求之前做些什么
  // config.data.abc = 'abc';
  config.data = qs.stringify(config.data);
  return config
}, error => {
  // 对请求错误做些什么
  return Promise.reject(error)
})

/*
 * 添加响应拦截器
 */
axios.interceptors.response.use(response => {
  // 对响应数据做点什么
  return response
}, error => {
  // 对响应错误做点什么
  if (error.toString().indexOf('timeout') !== (-1)) { // 请求超时
    return {
      status: 0 // 设置超时HTTP状态码为0
    }
  }
  return error.response
})

/*
 * 检测HTTP状态码
 */
function checkStatus (response) {
  let status = response.status
  if (!(/[23]/.test(Number(status.toString().charAt(0))))) { // HTTP状态码不以2或3开头均判断请求出错
    // 对响应错误做点什么
    response = { // 返回错误信息
      bedStatus: true,
      msg: errorMsg
    }
    console.log(status ? '请求报错（HTTP状态码：' + status + '）' : '请求超时') // 开发调试
  }
  return response // 正常返回数据
}

/*
 * 检测接口返回的状态码
 */
function checkCode (res) {
  loading.close();
  if (res.bedStatus) {
    Message(res.msg)
    res = false
  } else {
    // 在接口返回状态码之后做些什么（如下判断用户是否登录）
    if (res.data.statusCode === 2) {
      Message(res.data.message)
      res = false // 终止后续脚本执行
    }
  }
  return res
}

/**
 * 暴露POST/GET请求方法
 */
export default {
  post (url, data, loadState) {
    return axios({
      method: 'POST',
      url,
      data: data,
      timeout: timeout,
      headers: {
        'X-Requested-With': 'XMLHttpRequest',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
      },
      loadState: loadState
    }).then((response) => {
      return checkStatus(response)
    }).then((res) => {
      return checkCode(res)
    })
  },
  get (url, params, loadState) {
    return axios({
      method: 'GET',
      url,
      params,
      timeout: timeout,
      headers: {
        'X-Requested-With': 'XMLHttpRequest'
      },
      loadState: loadState
    }).then((response) => {
      return checkStatus(response)
    }).then((res) => {
      return checkCode(res)
    })
  }
}
